iT邦幫忙

2021 iThome 鐵人賽

DAY 24
0

前言

上兩篇中我們在介紹 Go 網路的操作中,有稍微提到 json 格式,那這篇將介紹有關何為 json,以及 Go 語言裡如何處理此格。json 為 JavaScript Object Notation 的簡稱,此為 JavaScript 物件的標準格式。常用於網站上的資料呈現與傳輸,以純文字去儲存和傳送結構資料。雖然是 JavaScript 的,但是其他語言也支援解析 json,當然也包含 Go 語言,而作為後端工程師的話,你會常常遇到 json 格式。我們稍微看一下格式長得怎樣:

json

json 為 JavaScript Object Notation 的簡稱,此為 JavaScript 物件的標準格式。常用於網站上的資料呈現與傳輸,以純文字去儲存和傳送結構資料。雖然是 JavaScript 的,但是其他語言也支援解析 json,當然也包含 Go 語言,而作為後端工程師的話,你會常常遇到 json 格式。我們稍微看一下格式長得怎樣:

{
	"class" : "A" ,  
	"persons" : [
		{"id" : 1 , "name" : "JC"},
		{"id" : 2 , "name" : "Eric"},
		{"id" : 3 , "name" : "Zhen"}
	]
}

encoding/json

Go 語言中的 encoding/json 套件,提供了函式 json.Unmarshal 可以把 json 字串轉成 struct,而 json.Marshal 可以將 struct 轉成 json 字串,以下我直接示範一個範例:

package main
 
import (
   "encoding/json"
   "fmt"
)
 
type Student struct {
   Id   int64  `json:"id"`
   Name string `json:name`
}
 
func main() {
   data := []byte(`{"id" : 1 , "name" : "JC"}`)
   var student Student
   json.Unmarshal(data, &student)
   fmt.Println(student)
   jsondata, _ := json.Marshal(student)
   fmt.Println(string(jsondata))
}

上面程式,我們宣告一個名為 Student 的 struct,裡面包含兩個結構,且與之前不太一樣的是,你必須告訴他,struct 的 key 對應到的 json 格式的 key 為何,如此一來,你就可以使用 Unmarshal 和 Marshal 來對 json 和 struct 做轉換。

而你的 json 可能會比較複雜,或許會包含一些 array,這時你就要去宣吿子母 struct,以下示範一個例子:

package main
 
import (
   "encoding/json"
   "fmt"
)
 
type Student struct {
   Id   int64  `json:"id"`
   Name string `json:name`
}
 
type Class struct {
   Class    string    `json:"class"`
   Students []Student `json:students"`
}
 
func main() {
   data := []byte(`{"class" : "A", "students" : [{"id" : 1 , "name" : "JC"}, {"id" : 2 , "name" : "Zhen"}]}`)
   var class Class
   json.Unmarshal(data, &class)
   fmt.Println(class)
   jsondata, _ := json.Marshal(class)
   fmt.Println(string(jsondata))
}

你可以以自己的需求去設計 struct,去達到解析 json 的功能!

結語

處理 json 是後端工程師幾乎都會遇到的課題,而在 Go 語言中提供很方便的套件,讓你可以在 json 和 struct 之間作轉換,只是在設計 struct 要多費心。謝謝各位讀者今天的閱讀,希望今天的講解對你有幫助!


上一篇
Day23-Go Gin
下一篇
Day25- Go with MySQL
系列文
golang後端入門分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言